package br.com.prontuario.faces;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import br.com.prontuario.entidade.SubCategoria;
import br.com.prontuario.enumgeral.CategoriaProcedimento;
import br.com.prontuario.logica.contract.DefaultLogicaContract;
import br.com.prontuario.util.FacesUtil;
import br.com.prontuario.util.StringUtil;

@ManagedBean(name="subCategoriaFaces")
@ViewScoped
public class SubCategoriaFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<SubCategoria> logicaSubCategoria;
	
	private SubCategoria subCategoria = new SubCategoria();
	private List<SubCategoria> listaSubCategoria = new ArrayList<>();
	private String subCategoriaBusca;
	private String nomeTemplate;

	private Boolean isPopup = false;

	public SubCategoriaFaces() {
		Boolean popup = (Boolean) getSession().getAttribute("isPopup");
		if (popup != null) {
			isPopup = popup;
		}
	}
	
	@PostConstruct
	public void init() {
		this.buscarSubCategoria();
		if (isPopup != null && isPopup) {
			nomeTemplate = "/templates/templateDialog.xhtml";
		} else {
			nomeTemplate = "/templates/template.xhtml";
		}
	}
	
	@PreDestroy
	public void finalizar() {
		getSession().setAttribute("isPopup", null);
	}
	
	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaSubCategoria.adicionar(subCategoria);
				adicionarMensagem("Sub Categoria adicionada com sucesso");
				this.buscarSubCategoria();
				fecharModal("dialogSubCategoria");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Sub Categoria");
		}
	}
	
	public void prepararAdicionar() {
		this.subCategoria = new SubCategoria();
		abrirModal("dialogSubCategoria");
	}
	
	public void selecionarRegistro(Long idArea, boolean editar) {
		try {
			this.subCategoria = logicaSubCategoria.obterPorId(SubCategoria.class,idArea);
			
			if (editar) {
				abrirModal("dialogSubCategoria");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaSubCategoria.editar(this.subCategoria);
				adicionarMensagem("Sub Categoria editada com sucesso");
				fecharModal("dialogSubCategoria");
				this.buscarSubCategoria();
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Sub Categoria");
		}
	}
	
	public void remover() {
		try {
			logicaSubCategoria.remover(SubCategoria.class, this.subCategoria.getId());
			adicionarMensagem("Sub Categoria removida com sucesso");
			fecharModal("dialogExcluir");
			this.buscarSubCategoria();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Sub Categoria");
		}
	}
	
	public void buscarSubCategoria() {
		if (listaSubCategoria != null) {
			this.listaSubCategoria.clear();
		}
		String campoBuscaOrdenacao = "nomeSubCategoria";
		try {
			if (!StringUtil.textoPreenchido(subCategoriaBusca)) {
				this.listaSubCategoria =  logicaSubCategoria.buscarTodos(SubCategoria.class, campoBuscaOrdenacao);
			} else {
				this.listaSubCategoria = logicaSubCategoria.buscarPorCampo(SubCategoria.class, campoBuscaOrdenacao, subCategoriaBusca, campoBuscaOrdenacao);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		
		if (this.subCategoria.getCategoriaProcedimento() == null ) {
			adicionarMensagem("O campo categoria é obrigatório");
			valido = false;
		}

		if (!StringUtil.textoPreenchido(this.subCategoria.getNomeSubCategoria())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public List<SubCategoria> autoComplete(String query) {
		List<SubCategoria> suggestions = new ArrayList<>();
		if (query.length() > 2) {
			try {
				suggestions = logicaSubCategoria.buscarPorCampo(SubCategoria.class, "nomeSubCategoria", query, "nomeSubCategoria");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return suggestions;
    }
	
	public List<CategoriaProcedimento> getListaCategoriaProcedimento() {
		List<CategoriaProcedimento> listaCategoriaProcedimento = Arrays.asList(CategoriaProcedimento.values());
		return listaCategoriaProcedimento;
	}
	
	public void selecionarNoDialog(SubCategoria subCategoria) {
        RequestContext.getCurrentInstance().closeDialog(subCategoria);
    }


	public SubCategoria getSubCategoria() {
		return subCategoria;
	}

	public void setSubCategoria(SubCategoria subCategoria) {
		this.subCategoria = subCategoria;
	}

	public List<SubCategoria> getListaSubCategoria() {
		return listaSubCategoria;
	}

	public void setListaSubCategoria(List<SubCategoria> listaSubCategoria) {
		this.listaSubCategoria = listaSubCategoria;
	}

	public String getSubCategoriaBusca() {
		return subCategoriaBusca;
	}

	public void setSubCategoriaBusca(String subCategoriaBusca) {
		this.subCategoriaBusca = subCategoriaBusca;
	}

	public void setLogicaSubCategoria(DefaultLogicaContract<SubCategoria> logicaSubCategoria) {
		this.logicaSubCategoria = logicaSubCategoria;
	}

	public Boolean getIsPopup() {
		return isPopup;
	}

	public void setIsPopup(Boolean isPopup) {
		this.isPopup = isPopup;
	}

	public String getNomeTemplate() {
		return nomeTemplate;
	}

	public void setNomeTemplate(String nomeTemplate) {
		this.nomeTemplate = nomeTemplate;
	}
	
	
}